package com.wwj.study.spring.formework.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class WAopProxy implements InvocationHandler {

    private WAopConfig config;
    private Object target;

    public void setConfig(WAopConfig config) {
        this.config = config;
    }

    //获取代理对象
    public Object getProxyInstance(Object target){
        this.target=target;
        Class<?> clazz = target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //代理对象执行
        //1、根据方法名称获取需要执行的切面对象
        //method是抽象的方法体，来自接口类
        //methodClass转换成原对象的方法形式
        Method methodClass= this.target.getClass().getMethod(method.getName(),method.getParameterTypes());
        Boolean flag= config.getAspectMap().containsKey(methodClass);

        //2、如果切面集合中，存在该方法，就执行前置方法
        if(flag){
            WAopConfig.WAspect aspect= config.getAspectMap().get(methodClass);
            aspect.getMethods()[0].invoke(aspect.getAspect());
        }

        //3、执行方法主体
        Object obj= method.invoke(target,args);

        //4、如果切面集合中，存在该方法，就执行后置方法
        if(flag){
            WAopConfig.WAspect aspect= config.getAspectMap().get(methodClass);
            aspect.getMethods()[1].invoke(aspect.getAspect());
        }

        return obj;
    }
}
